Java/C++プログラマのためのSwiftチートシート
Java/C++プログラマーのためのSwiftチートシートです。
現在の内容は 2014/11/27 のものです。項目は適宜追加される可能性があります。
概要
むかしむかし、この地球には「ぼくはJava(C++)を愛しているから、どうしてもObjective-Cを書く気にならない。だからぼくは、iOS開発しないんだ」というおじさんがたくさんいました。
私達にとって、Swiftは朗報でした。しかし、C++/JavaベースでSwiftを説明しているリファレンスは、現状そんなに多くありません(少なくとも、Objective-Cベースのリファレンスに比べれば)。そんなわけで、基本的な部分のみですが、差分をまとめましたので、ご活用ください。
バージョン情報
本記事は、下記のバージョンについて記述しています。
言語 | バージョン |
---|---|
Java | SE 6 |
C++ | ISO/IEC 14882:2011 |
Swift | 1.0 |
また、各言語とも、自明の前置きについては省略しています。(#include <iostream>, import Foundation, etc...)
変数の定義と初期化
Java | C++ | Swift |
---|---|---|
int i = 0; | int i = 0; | var i : Int = 0 |
final int K = 127; | const int K = 127; | let K : Int = 127 |
CHoge hoge = new CHoge(); | CHoge* hoge = new CHoge; ... delete hoge; |
var hoge : CHoge = CHoge() |
final CHoge hoge = new CHoge(); | CHoge* const hoge = new CHoge; ... delete hoge; |
let hoge : CHoge = CHoge() |
該当なし | const CHoge* hoge = new CHoge; ... delete hoge; |
該当なし |
該当なし | auto num = 1; | var num = 1 |
該当なし | const auto num = 1; | let num = 1 |
該当なし | auto hoge = new CHoge; | var hoge = CHoge() |
該当なし | auto const hoge = new CHoge; | let hoge = CHoge() |
int[] arr = new int[5]; | int arr[5]; | 該当なし |
ArrayList<Integer> arr = new ArrayList<Interger>(); |
std::vector<int> arr(); | var arr : [Int] = [Int]() |
クラス・メンバ・メンバ関数の定義
Java
class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return this.name; } public String getCombinedName(Person p) { return this.name + " with " + p.getName(); } }
C++
class Person { private: const char* name; public: Person(const char *); const char* GetName(); const char* GetCombinedName(Person &); }; Person::Person(const char* name) { this->name = name; } const char* Person::GetName() { return this->name; } const char* Person::GetCombinedName(Person &p) { return (std::string(this->name) + " with " + p.GetName()).c_str(); }
Swift
class Person { let name : String // variables declared by 'let' have a read-only policy init(name : String) { self.name = name } func getCombinedName(h: Person) -> String { return self.name + " with " + h.name; } }
クロージャ
Java
interface Function<T> { public T invoke(); } class Wrapper<T> { public T value; public Wrapper(T value) { this.value = value; } } class ClosureTest { public static Function<Integer> createSequenceClosure() { final Wrapper<Integer> count = new Wrapper(new Integer(0)); return new Function<Integer>() { public Integer invoke() { return ++count.value; } }; } public static void main (String[] args) { Function<Integer> seqA = createSequenceClosure(); System.out.println("seqA:" + seqA.invoke()); // -> seqA:1 Function<Integer> seqB = createSequenceClosure(); System.out.println("seqA:" + seqA.invoke() + " seqB:" + seqB.invoke()); // -> seqA:2 seqB:1 } }
C++
int main() { auto CreateSequenceClosure = []() { int count = 0; return [&]() { return ++count; }; }; auto SeqA = CreateSequenceClosure(); std::cout << "SeqA:" << SeqA() << std::endl; // -> SeqA:1 auto SeqB = CreateSequenceClosure(); std::cout << "SeqA:" << SeqA() << " SeqB:" << SeqB() << std::endl; // -> SeqA:2 SeqB:1 }
Swift
let createSequence = { () -> () -> Int in var count = 0 return { return ++count } } let seqA = createSequence() println("seqA:\(seqA())") // -> seqA:1 let seqB = createSequence() println("seqA:\(seqA()) seqB:\(seqB())") // -> seqA:2 seqB:1
補足
- Javaは、Androidで使用されているJava SE 6で記述したので、他と比べ冗長になっています。Java SE 8ならもっと戦えます(たぶん)。
- Java/C++と異なり、Swiftは関数型プログラミングを強くサポートしています。がっつり使っていく場合は、あまりJava/C++のプラクティスを流用すべきではないかもしれません。